package modelo;

import java.util.Random;

public class Auto extends Thread{
	private static Integer countId = 1;
	private Integer idAuto;
	private Integer velocidad;
	private Bloque bloque;
	private Boolean dobla;
	private Boolean finalizar;
	private Direccion direccion;
	
	public Auto() {
		this(new Random().nextBoolean());
	}
	
	public Auto(Boolean dobla){
		this.idAuto = countId++;
		this.velocidad = new Random().nextInt(1500) + 400;
		this.dobla = dobla;
		this.finalizar = false;
	}
	
	protected Bloque getDestino() {
		return Mundo.getInstance().getBloqueLimitrofe(this.getBloque(), this.getProximaDireccion());
	}
	
	protected Direccion getProximaDireccion() {
		if (this.getBloque().esDobleSentido() && this.getDobla()) {
			this.setDobla(false);
			this.direccion = this.getBloque().getSegundoSentido();
		} else {
			this.direccion = this.getBloque().getSentido();
		}
		return this.direccion;
	}
	
	protected void avanzar(Bloque destino) {
		Bloque previo = this.getBloque();
		if (destino != null) {
			destino.entrar(this);
			previo.liberar(this);
			this.dormir();
		} else {
			this.finalizar = true;
			previo.liberar(this);
		}
	}
	
	public void run() {
		this.dormir();
		while (!this.finalizar) {
			Bloque calleDestino = this.getDestino();
			this.esperarVerde();
			this.avanzar(calleDestino);
		}
	}
	
	protected void esperarVerde() {
		if (this.getBloque().tieneSemaforo()) {
			((CalleConSemaforo) this.getBloque()).esperarVerde();
		}
	}

	protected void dormir() {
		try {
			sleep(this.getVelocidad());
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
	}
	
	//GETTERS Y SETTERS

	public int getVelocidad() {
		return velocidad;
	}
	
	public void setVelocidad(int velocidad) {
		this.velocidad = velocidad;
	}

	public Bloque getBloque() {
		return bloque;
	}

	public void setBloque(Bloque bloque) {
		this.bloque = bloque;
	}

	public Boolean getDobla() {
		return dobla;
	}

	public void setDobla(Boolean dobla) {
		this.dobla = dobla;
	}

	public Integer getIdAuto() {
		return idAuto;
	}

	public void setIdAuto(Integer idAuto) {
		this.idAuto = idAuto;
	}

	public Direccion getDireccion() {
		return direccion;
	}

	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}
}
